//
// Created by dqchen on 2022/12/12.
//

#ifndef QUEST_0_1_SYMBOL_H
#define QUEST_0_1_SYMBOL_H
#include "meta.h"
#include "intermediate.h"

using namespace std;

class Var {
    string name;
    Tag type;   //变量类型
    int size;   //大小

    int num_val;
    char ch_val;
    string str_val;
    Var *data;  //变量的值
    vector<int> scope;  //作用域
    int offset;         //当前变量的esp偏移量

    bool pointer;   //是否为指针类型
    Var *ptr_val;     //指针变量的值

    string struct_type;  //结构体申明的类型
    vector<Var*> struct_var; //结构体中变量的值
    void init(Tag t);
public:
    string getName();
    void setName(string n);
    Tag getType();
    int getSize();
    void setOffset(int esp);
    int getOffset();
    void setData(Var *v);
    Var* getData();
    string getStrVal();
    int getNumVal();
    char getCharVal();
    bool isTemp();
    void printMid(FILE *midf);
    void setPtrVal(Var *v);
    void addStructVar(Var *v);
    Var *getStructVar(string name);
    string getStructType();
    vector<Var*> getStructVar();
    void setStructVar(vector<Var*> v);

    Var();
    Var(Token* t);
    Var(Tag t, string name);
    Var(Tag t, string name, bool ptr);
    Var(Tag t, string n,  vector<int>& scope);
    Var(string name, Var* v, Tag t, vector<int>& scope, bool ptr);
    ~Var();
};

class Func{
    string name;
    Tag rtype;  //返回值类型
    vector<Var*> params; //参数列表
    vector<int> scope;  //作用域
    int esp; //当前esp
    int max_esp; //最大深度

    vector<Order*> orders;  //中间代码指令
    Order *retLab;  //函数返回标签
    bool sys_func;  //是否系统函数
public:
    string getName();
    void setName(string n);
    Tag getType();
    void addOrder(Order* order);
    void setRet(Order *r);
    void incScope();
    void decScope();
    vector<Order*> getOrders();
    void allocEsp(Var* var);
    Order *getRet();
    int getMaxEsp();
    bool isSys();

    Func();
    Func(Tag t, string n, vector<Var*> &ps);
    Func(Tag t, string n, bool  sys);
    ~Func();

};

#endif //QUEST_0_1_SYMBOL_H
